<?php
/**
 * 接口基类，定义通用调用的方法
 * @author JohnnyDen <413819942@qq.com>
 * @package NMClient\Core
 * @return array 
 * <code>
 * array(
 *      'status'    => 'ok',
 *      'info'      => '',
 *      'data'      => array(),
 * );
 * </code>
 * <b>通用错误status</b>
 * - ok:                        成功
 * - error_status_code:         错误的状态码
 *
 * - no_access_request:         禁止请求
 * - request_timeout:           请求超时: %s
 * - empty_id_client:           缺少id_client
 * - empty_sign:                缺少sign
 * - error_sign:                错误的sign: %s
 * - error_crypt_level:         加密通信等级错误
 * - api_no_access:             接口无权访问
 *
 * - error_access_token:        无效或失效的通信凭证
 * - no_access:                 无权访问
 * - no_access_user:            用户无权访问
 * - exe_fail:                  执行失败
 * - exe_frequently:            操作过于频繁
 * - empty_update:              要修改的数据不存在
    
 * - user_disabled:             用户已被禁用
 * - login_error:               登录失败，帐号或密码错误
 * - empty_refresh_token:       刷新凭证不能为空
 * - error_refresh_token:       错误的刷新凭证
 * - refresh_token_timeout:     更新凭证已过期失效
 * - null_user:                 用户不存在
 * - error_refresh_access_token:更新用户凭证失败
 *
 * @copyright 2017年12月9日
 */
namespace NMClient\Core;

class Base {
    
    /**
     * 接口调用基础处理方法
     * 
     * 根据$class, $method自动匹配请求接口的controller和action，同时传参$controller和$action取代自动匹配的值；
     * 
     * @example self::call(__CLASS__, __FUNCTION__, func_get_args());
     * @example self::call(__CLASS__, __FUNCTION__, func_get_args(), 'Admin/Test', 'index');
     * 
     * @param string $class 调用者类名
     * @param string $method 调用者方法名
     * @param array $args 调用者的函数队列
     * @param string $controller 接口controller名
     * @param string $action 接口action名
     * @param int $crypt_level 加密等级
     * @param array $crypt_level
     * @param array $files 上传文件
     * <code>
     * array(
     *      'image'  => '/tmp/erfngxiw'
     * );
     * </code>
     * @return array
     * <code>
     * array(
     *         'status'     => 'ok',
     *         'info'        => '',
     *         'data'        => array()
     * )
     * </code>
     */
    static protected function call($class, $method, &$args = null, $controller = '', $action = '', $crypt_level = 0, $files = false) {
        if (!$action) {
            $action    = &$method;
        }
        if (!$controller) {
            $controller     = explode('\\', $class);
            $controller     = $controller[sizeof($controller) - 1];
        }
        
        $Reflection    = new \ReflectionMethod($class, $method);
        $params = $Reflection->getParameters();
        foreach ($params as $key => $param) {
            if (isset($args[$key])) {
                $data[$param->name]    = &$args[$key];
            } else if ($param->isOptional()) {
                $data[$param->name]    = $param->getDefaultValue();
            }
        }
        if ($data['access_token']) {
            $access_token    = $data['access_token'];
            unset($data['access_token']);
        }
        
        $_class = '\\NMClient\\Core\\Http';
        return $_class::call($controller, $action, $data, $access_token, $crypt_level, $files);
    }
}